﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DwoDimensionalArray
{
    class Program
    {
        static void Main(string[] args)
        {
            MultiplyNotNullElementsTask();

            double d = 25.0;
            float f = 13.5f;
            uint u = 683u;
        }



        //methods

        // вводит двумерный массив с рандом значениями и выдает на экран в 2 метода

        static void Task1_2()

        {
            int minValue;
            int maxValue;
            int rowCount;
            int colomnCount;

            Console.WriteLine("Введите количество строк");
            rowCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите количество столбцов");
            colomnCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine();
            Console.WriteLine("Введите минимум для рандома");
            minValue = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите максимум для рандома");
            maxValue = Int32.Parse(Console.ReadLine());


            int[,] sizedArray = DwoArrayRandomConstructor(rowCount, colomnCount, minValue, maxValue);

            ArrayLayoutToConsole(sizedArray);
        }


        // выводит двумерный массив в консоль
        static void ArrayLayoutToConsole(int[,] array)
        {
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    Console.Write("{0}\t", array[i, j]);
                }
                Console.WriteLine();
            }
        }

        // создает двумерный массив по параметрам строк/столбцов, мин и макс рандомных значений
        static int[,] DwoArrayRandomConstructor(int rowCount, int colomnCount, int minValue, int maxValue)
        {
            int[,] intArray = new int[rowCount, colomnCount];
            Random rnd = new Random();

            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < colomnCount; j++)
                {
                    intArray[i, j] = rnd.Next(minValue, maxValue);
                }
            }
            return intArray;
        }

        //считает сумму элементов в первых 4 колонках и записывает в пятую
        static int[,] TotalofOfRowToFifthColomn(int[,] array)
        {
            int sum;
            for (int i = 0; i < 4; i++)
            {
                sum = 0;
                for (int j = 0; j < 5; j++)
                {
                    if (j < 4)
                    {
                        sum = sum + array[i, j];
                    }
                    else
                    {
                        array[i, j] = sum;
                    }
                }
            }
            return array;

        }

        //Решение задачи 1 с 1.1 по 1.4
        static void Complete11to14Task()
        {
            int minValue;
            int maxValue;
            Console.WriteLine("Введите минимум для рандома");
            minValue = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите максимум для рандома");
            maxValue = Int32.Parse(Console.ReadLine());

            // 1.1) Создается 2 - х мерный массив размером 4 на 5 элементов, заполненный случайными числами
            int[,] sizedArray = DwoArrayRandomConstructor(4, 5, minValue, maxValue);

            // 1.2) Вывести массив на консоль

            Console.WriteLine("Начальный массив: ");

            ArrayLayoutToConsole(sizedArray);

            //1.3) Заменить 5 - й элемент каждой строки суммой 4 - х предыдущих элементов этой строки

            TotalofOfRowToFifthColomn(sizedArray);

            //1.4) Вывести полцученный результат на экран
            Console.WriteLine("Массив с измененными значениями в 5-й колонке: ");

            ArrayLayoutToConsole(sizedArray);
        }

        static void SquareArrayDiagonalSum()
        {
            Console.WriteLine("Введите количество столбцов/строк квадратного массива");
            int sideCount = Int32.Parse(Console.ReadLine());

            int[,] squareArray = DwoArrayRandomConstructor(sideCount, sideCount, -100, 100);

            Console.WriteLine("Квадратный массив");
            ArrayLayoutToConsole(squareArray);

            Console.WriteLine("Сумма элементов на гавной диагонали массива равна: {0}", DiagonalSum(squareArray));



        }
        //Пользователь задает размер квадратного двухмерного массива.Массив заполняется 
        //случайными числами в диапазоне от -100 до 100. Найти сумму элементов 
        //расположенных на главной диагонале. (i= j)

        static int DiagonalSum(int[,] array)
        {
            int sum = 0;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (i == j)
                    {
                        sum = sum + array[i, j];
                    }
                }
            }
            return sum;
        }

        //1) Создать массив - размеры массива выбирает пользователь из консоли.
        //Заполнить массив случайными числами в диапазоне от 1 до 20. 
        //Вывести полученный массив на экран.Посчитать количество четных и нечетных элементов в массиве

        static void OneToTwentyArrayEvenOddLayout()
        {
            Console.WriteLine("Введите количество строк");
            int rowCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите количество столбцов");
            int colomnCount = Int32.Parse(Console.ReadLine());

            int[,] userArray = DwoArrayRandomConstructor(rowCount, colomnCount, 0, 21);

            Console.WriteLine("Your array:");
            ArrayLayoutToConsole(userArray);

            EvenOddCounter(userArray);

        }

        // считает количество четных и нечетных элементов массива и выдает ответ в консоль
        static void EvenOddCounter(int[,] array)
        {
            int evenCount = 0;
            int oddCount = 0;

            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if ((array[i, j] % 2 == 0) && (array[i, j] != 0))
                    {
                        evenCount++;
                    }
                    else if (array[i, j] % 2 == 1)
                    {
                        oddCount++;
                    }
                }
            }
            Console.WriteLine("Count of Even = {0}, count of odd = {1}", evenCount, oddCount);
        }

        //2) Создать двумерный массив, заполненный случайными числами.
        //    После заполнения — показать заполненный массив на экран и 
        //    посчитать сумму элементов отдельно в каждом столбце и каждой строке.

        static void RowColomnCount()
        {
            int minValue;
            int maxValue;
            int rowCount;
            int colomnCount;

            Console.WriteLine("Enter row count");
            rowCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter colomns count");
            colomnCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine();
            Console.WriteLine("Enter random min value");
            minValue = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter random max value");
            maxValue = Int32.Parse(Console.ReadLine());


            int[,] sizedArray = DwoArrayRandomConstructor(rowCount, colomnCount, minValue, maxValue);
            Console.WriteLine("Your array:");
            ArrayLayoutToConsole(sizedArray);

            RowColomnSum(sizedArray);

        }

        // Считает суммы во всех рядах и всех колонках и выводит в консоль
        static void RowColomnSum(int[,] array)
        {
            int rowNumber = 0;
            int colNumber = 0;
            int sumInRow = 0;
            int sumInColomn = 0;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                sumInRow = 0;
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    sumInRow = sumInRow + array[i, j];
                }
                rowNumber++;
                Console.WriteLine("Sum for row {0} = {1}", rowNumber, sumInRow);
            }
            for (int i = 0; i < array.GetLength(1); i++)
            {
                sumInColomn = 0;
                for (int j = 0; j < array.GetLength(0); j++)
                {
                    sumInColomn = sumInColomn + array[j, i];
                }
                colNumber++;
                Console.WriteLine("Sum for colonm {0} = {1}", colNumber, sumInColomn);
            }
        }

        //3) Заполнить двумерный массив случайными числами от 10 до 100. 
        //    Посчитать сумму элементов отдельно в каждой строке и 
        //    определить номер строки, в которой эта сумма максимальна
        static void MaxValueOfRowSums()
        {
            int rowCount;
            int colomnCount;

            Console.WriteLine("Enter row count");
            rowCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Enter colomns count");
            colomnCount = Int32.Parse(Console.ReadLine());


            int[,] sizedArray = DwoArrayRandomConstructor(rowCount, colomnCount, 10, 100);
            Console.WriteLine("Your array:");
            ArrayLayoutToConsole(sizedArray);
            MaxRowCount(sizedArray);



        }

        static void MaxRowCount(int[,] array)
        {
            int sumInRow = 0;
            int[] sumRowsArray = new int[array.GetLength(0)];
            for (int i = 0; i < array.GetLength(0); i++)
            {
                sumInRow = 0;
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    sumInRow = sumInRow + array[i, j];
                }
                sumRowsArray[i] = sumInRow;
                Console.WriteLine("Sum for row {0} = {1}", i, sumRowsArray[i]);
            }
            Console.WriteLine("Max row value sum is {0} in row {1}", sumRowsArray.Max(), Array.IndexOf(sumRowsArray, sumRowsArray.Max()));
        }

        //4) Создать двумерный массив, заполненный случайными числами.Найти произведение ненулевых элементов массива.

        static void MultiplyNotNullElementsTask()
        {
            int minValue;
            int maxValue;
            int rowCount;
            int colomnCount;

            Console.WriteLine("Введите количество строк");
            rowCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите количество столбцов");
            colomnCount = Int32.Parse(Console.ReadLine());
            Console.WriteLine();
            Console.WriteLine("Введите минимум для рандома");
            minValue = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите максимум для рандома");
            maxValue = Int32.Parse(Console.ReadLine());


            int[,] sizedArray = DwoArrayRandomConstructor(rowCount, colomnCount, minValue, maxValue);

            ArrayLayoutToConsole(sizedArray);

            NotNullElementsMultiplier(sizedArray);

        }
        static void NotNullElementsMultiplier(int[,] array)
        {
            double multiplierOfArray = 1;
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                {
                    if (array[i, j] != 0)
                        multiplierOfArray = multiplierOfArray * array[i, j];
                }
            }
            Console.WriteLine("Total result of array is {0}", multiplierOfArray);
        }

    }
}
